/*本文件：二次封装axios，称为instance，使其功能更强大
1.在【请求拦截器】中统一处理所有post请求关于参数的问题 （【注意】axios的拦截器，始终伴随着两个字“统一”）*/


import axios from "axios";
import qs from "querystring"
import { message } from "antd"
//引入加载进度条
import NProgress from "nprogress";
import store from "../redux/store"
import {createDeleteUserInfoAction} from "../redux/actions/login_action"
import 'nprogress/nprogress.css'

const instance = axios.create({
    timeout: 4000
})

//请求拦截器 （统一处理post请求参数）
instance.interceptors.request.use(
    (config) => {
        NProgress.start()
        //带上token
        const {token} = store.getState().userInfo   //因为在js文件中(没有容器组件)，没法用connect方法给redux状态，所有就得用原生rudux获取状态方法
        // 如果有token，就向请求头添加token，用于校验身份
        if(token) {
            config.headers.Authorization =  token
        }

        const { method, data } = config
        //若请求方式为post
        if (method.toLocaleLowerCase() === 'post') {
            //若要传递过去的参数是对象(JSON)格式
            if (data instanceof Object) {
                // 则转换为urlencoded
                config.data = qs.stringify(data)
            }
        }
        return config
    }
)

//响应拦截器 （统一处理响应报错(如终止Promise链，以至于到不了catch)）
instance.interceptors.response.use(
    //响应成功
    (response) => {
        NProgress.done()
        // 这里返回的直接是data了，所以then里的then----> result 就直接是data
        return response.data
    },
    //响应失败
    (error) => {
        NProgress.done()  
        // 如果是401的错，那说明token过期，其他的错有可能是网速太慢
        if(error.response.status === 401) {
            message.error("校验失败，请重新登录")
            store.dispatch(createDeleteUserInfoAction())
        } else {
            //通过antd的message，提示错误(提示框维持1s)
            message.error(error.message, 1)
        }
        
        //中断Promise链，使catch走不到
        return new Promise(() => { })
    }
)

export default instance